import type { InjectionKey } from 'vue'
import { watch } from 'vue'
// 状态
import { defineStore, useStoreLocal } from '@naturefw/nf-state'
import type { IState } from '@naturefw/nf-state/dist/type'
// 类型
import type {
  IModuleTree,
  IModuleState
} from '../types/10-module'
// 转换函数
import { listToTree, treeToList } from '../controller/module'
// 状态的标识，避免命名冲突
const flag = Symbol('module') as InjectionKey<string>

/**
 * 注册局部状态
 * * 部门信息管理用的状态 : IModuleState & IState
 * @returns
 */
export const regModuleState = (): IModuleState & IState => {
  // 定义 角色用的状态
  const state = defineStore<IModuleState>(flag, {
    state: (): IModuleState => {
      return {
        moduleTree: [], // 部门信息，绑定 tree
        moduleList: [], // 部门信息，后端用的
        moduleObject: {},
        currentModule: { // 当前的部门的信息
          id: 0, // 部门ID
          num: 1, // 序号
          sortAll: 1, // 类型转换时用的排序
          info: { // 选中的节点
            id: '',
            label: ''
          } 
        }
      }
    },
    getters: {
    },
    actions: {
      /**
       * 后端列表 转为 tree，需要手动执行
       */
      async listToTree () {
        listToTree(this)
      },
      /**
       * tree 转换为 后端列表
       */
      async treeToList() {
        // 先清空
        this.moduleList.length = 0
        // 重置总排序
        this.currentModule.sortAll = 1
        // 遍历 tree 的第一级节点
        this.moduleTree.forEach((module: IModuleTree, index: number) => {
          // 状态， 父ID，层数，path，子节点，同级排序
          treeToList(this, 0, 0, '', module, index)
        })
      }
    }
  },
  { isLocal: true }
  )
 
  return state
}

/**
 * 子组件获取状态
 */
export const getModuleState = (): IModuleState & IState => {
  return useStoreLocal<IModuleState & IState>(flag)
}
